Objekty

Otázka od: Jiri Lev

3. 9. 2002 10:11

Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to,
ze pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat,
aby to fungovalo jak ma.
Nedalo by se to nejak "zuniverzalnit" ???
 
   For i:=0 to Form1.ComponentCount-1 Do Begin
       obj := Form1.Components[i];
       If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
       If (obj is TButton) Then (obj as TButton).Caption := 'y';
       ........
   End;

Predem dik za vsechny postrehy
 
J

Odpovedá: ing. Jan Fiala

3. 9. 2002 12:13

Jde to castecne vyresit, pokud pouzijes spolecneho predka, ktery je v
hierarchii nejvys a pritom ma jeste potrebne vlastnosti.
V tomto pripade je to TControl.
Takze by to mohlo vypadat takto:

    For i:=0 to Form1.ComponentCount-1 Do Begin
        obj := Form1.Components[i];
        If obj is TControl Then TControl(obj).Caption := 'x';
        ........
    End;

Stale se nevyhnes deleni, ale zmensis pocet techto deleni.
    
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

3.9.2002 Jiri Lev:
> Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to,
> ze pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat,
> aby to fungovalo jak ma.
> Nedalo by se to nejak "zuniverzalnit" ???
 
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;

> Predem dik za vsechny postrehy
 
> J

Odpovedá: Lauko Stefan

3. 9. 2002 14:05

Ahoj asi takto:

  Uses TypInfo;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

Procedure SetCaption(O:TObject; S:String);
begin
  try
  SetStrProp(O, 'Caption',S);
  Except
  end;
end;

var
 i:Integer;
 begin
 For i:=0 to Form1.ComponentCount-1 Do
   Begin
     SetCaption(Form1.Components[i],'Ahoj...');
   End;
end;
end.
Lauko
----- Original Message -----
From: Jiri Lev
Nedalo by se to nejak "zuniverzalnit" ???

   For i:=0 to Form1.ComponentCount-1 Do Begin
       obj := Form1.Components[i];
       If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
       If (obj is TButton) Then (obj as TButton).Caption := 'y';
       ........
   End;


Odpovedá: Ludek Finstrle

3. 9. 2002 11:49

> Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to,
> ze pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat,
> aby to fungovalo jak ma.
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;

Zjistit, ktery predchudce uz ma Caption. Ted nesedim u Win stroje,
takze nevim presne, ale tusim nejaky TControl??

Luf

Odpovedá: martin.falta@obi.de

3. 9. 2002 19:09


podivej se do forms.pas na metodu TApplication.CreateForm. tam bys mohl
najit inspiraci.


Martin Falta
OBI IT
tel.: +420 2 96576 156
GSM: +420 603 151147


                                                                                

                    levj@jhv.cz

                    Sent by: To: delphi-l@clexpert.cz

                    delphi-l-owner@c cc:

                    lexpert.cz Subject: Objekty

                                      
                                                                                

                    03.09.2002 11:07

                    Please respond

                    to delphi-l

                                      
                                                                                






Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to, ze
pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat, aby
to fungovalo jak ma.
Nedalo by se to nejak "zuniverzalnit" ???

   For i:=0 to Form1.ComponentCount-1 Do Begin
       obj := Form1.Components[i];
       If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
       If (obj is TButton) Then (obj as TButton).Caption := 'y';
       ........
   End;

Predem dik za vsechny postrehy

J


Odpovedá: Libor Junek, KSH-Data

3. 9. 2002 20:02

pouzij SetPropValue v TypInfo to nastavuje property podle nazvu.

Libor

From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
Behalf Of Jiri Lev

> Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to, ze
pokazdy kdyz pridam nejakou novou > tridu, tak ji do toho musim dopsat, aby
to fungovalo jak ma.
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;

Odpovedá: Petr Vones

3. 9. 2002 13:30

From: "Jiri Lev" <levj@jhv.cz>
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;

uses
  TypInfo;

function SetControlCaption(Control: TControl; const Caption: string): Boolean;
var
  PropInfo: PPropInfo;
begin
  PropInfo := GetPropInfo(Control, 'Caption', [tkLString]);
  Result := PropInfo <> nil;
  if Result then
    SetStrProp(Control, PropInfo, Caption);
end;

Petr Vones

Odpovedá: Jiri Lev

3. 9. 2002 13:49

Jo, jo, jo, jo.....  
Dik, Dik I vsem ostatnim, zas sem o trosicku chytrejsi  

-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of Petr Vones
Sent: Tuesday, September 03, 2002 2:30 PM
To: delphi-l@clexpert.cz
Subject: Re: Objekty


From: "Jiri Lev" <levj@jhv.cz>
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;

uses
  TypInfo;

function SetControlCaption(Control: TControl; const Caption: string):
Boolean; var
  PropInfo: PPropInfo;
begin
  PropInfo := GetPropInfo(Control, 'Caption', [tkLString]);
  Result := PropInfo <> nil;
  if Result then
    SetStrProp(Control, PropInfo, Caption);
end;

Petr Vones

Odpovedá: Petr Vones

3. 9. 2002 18:52

From: "Lauko Stefan" <laukosw@naex.sk>
> Procedure SetCaption(O:TObject; S:String);
> begin
> try
> SetStrProp(O, 'Caption',S);
> Except
> end;
> end;

Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek. Vyjimka je neco
vyjimecneho, co by nemelo za beznych podminek vzniknout. V tomto pripade je
vsak pouzita jako nedilna soucast logiky te procedury. (nemluve o predavani
promenne typu string ktera by mela byt const S: string)

Zjednodusene misto:

  Abc;
  if I = 0 then
    X := False
  Xyz;

je tento kod ekvivalentni:

  Abc;
  try
    if I = 0 then
      raise Exception.Create(...
  except
    X := False;
  end;
  Xyz;

Pomineme-li ze vyjimky jsou pomerne casove narocne, je to z hlediska navrhu
krajne nevhodne reseni.

Petr Vones

Odpovedá: Petr Vones

3. 9. 2002 17:52

From: "Petr Vones" <pvones@mbox.vol.cz>
> je tento kod ekvivalentni:

... ve vyznamu, ekvivalentni nevhodnemu reseni v puvodnim prispevku.

Petr Vones

Odpovedá: Erik Salaj

5. 9. 2002 1:58

> No jo, jenze to je dnes modni a dokonce to ma svuj terminus technicus -
> ofenzivni programovaci styl  . Nediv se, je to pohodlnejsi, mene
> narocne na hlavu a zejmena to zapada do komercniho modelu prodeje SW. Proc
> ztracet cas dukladnou analyzou a optimalizaci reseni, kdyz staci koupit
> vykonnejsi pocitac, ze...

problem moze byt v znalostiach programatorov, t.j. ci vedia
posudit vyhodnost/nevyhodnost pouzitia.

Erik

Odpovedá: Zbysek Hlinka

4. 9. 2002 8:58

On 3 Sep 2002 at 18:41, Petr Vones wrote:

> From: "Lauko Stefan" <laukosw@naex.sk>
> > Procedure SetCaption(O:TObject; S:String);
> > begin
> > try
> > SetStrProp(O, 'Caption',S);
> > Except
> > end;
> > end;
>
> Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek.

Ba prave naopak, toto pouziti je naprosto na miste. Trida totiz muze
obsahovat napriklad validaci vlastnosti, ktera probehne spravne kdyz
napises

Objekt.Caption := 'blabla';

ale skonci chybou, kdyz to naplnis pres SetXxxProp. Na tento problem
jsem narazil pri psani Lokalizatoru, konkretne u tridy
TMaskEdit.Text, kde SetStrProp skonci chybou, pokud se plni jindy nez
pri csLoading, protoze se spusti validace. Plnil jsem tam hodnotu,
ktera prisla z navrhu formulare. Pokud nemas jistotu, jake objekty se
ti tam nahrnou, je pouziti try except nezbytne.

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Jiri Foldyna

4. 9. 2002 10:25

> Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek.
> Vyjimka je neco
> vyjimecneho, co by nemelo za beznych podminek vzniknout. V
> tomto pripade je
> vsak pouzita jako nedilna soucast logiky te procedury.
krajne nevhodne reseni.
>
> Petr Vones
>

No jo, jenze to je dnes modni a dokonce to ma svuj terminus technicus -
ofenzivni programovaci styl  . Nediv se, je to pohodlnejsi, mene
narocne na hlavu a zejmena to zapada do komercniho modelu prodeje SW. Proc
ztracet cas dukladnou analyzou a optimalizaci reseni, kdyz staci koupit
vykonnejsi pocitac, ze...

Zdravim

Jiri Foldyna
mailto:jiri.f@avizo.cz

Odpovedá: Petr Vones

4. 9. 2002 14:09

From: "Jiri Foldyna" <jiri.f@avizo.cz>
> No jo, jenze to je dnes modni a dokonce to ma svuj terminus technicus -
> ofenzivni programovaci styl  . Nediv se, je to pohodlnejsi, mene
> narocne na hlavu a zejmena to zapada do komercniho modelu prodeje SW. Proc

Mozna, ale pouzivat misto jedne konstrukce if ... then try..raise..except neni
prilis pohodlne a navic v tom puvodnim prikladu to melo jeste dalsi chybu a
to, ze se takto 'neosetrovala' pouze predpokladana vyjimka, ale vsechny dalsi
ktere mohly indikovat jinou dalsi (tentokrate skutecne nepredpokladanou)
chybu.

Timto 'modernim' stylem by jsme se vlastne mohli dostat i ke konstrukcim jako
(pripad kdy instance objektu nemusi existovat):

var
  O: TSomeObject;

try
  O.SomeMethod; // Access Violation pokud O = nil ...
except
end;

Misto:

var
  O: TSomeObject;

if Assigned(O) then
  O.SomeMethod;

Je to stale spravne reseni ?

Jinak receno, pouziva-li se nekde konstrukce try..except je nutne dobre zvazit
jeji oduvodnenost a mozne dusledky.

Petr Vones

Odpovedá: Petr Vones

4. 9. 2002 14:04

From: "Zbysek Hlinka" <hlinka@hlinka.cz>
> Ba prave naopak, toto pouziti je naprosto na miste. Trida totiz muze
> obsahovat napriklad validaci vlastnosti, ktera probehne spravne kdyz
> napises
>
> Objekt.Caption := 'blabla';
>
> ale skonci chybou, kdyz to naplnis pres SetXxxProp. Na tento problem

Jaky je prosimte mezi tim rozdil, oba pripady totiz skonci volanim
TControl.SetText.

> jsem narazil pri psani Lokalizatoru, konkretne u tridy
> TMaskEdit.Text, kde SetStrProp skonci chybou, pokud se plni jindy nez
> pri csLoading, protoze se spusti validace. Plnil jsem tam hodnotu,

Stejne by to bylo i pri primem volani Caption := '...'.

> ktera prisla z navrhu formulare. Pokud nemas jistotu, jake objekty se
> ti tam nahrnou, je pouziti try except nezbytne.

Pokud vznikne vyjimka (tedy situace neocekavana, chybna, branici pokracovat v
danem kodu) tak to neznamena ze to jen tak zahodis a delas, ze se nic nedeje.
V pripade TMaskEdit je to napriklad to, ze po validaci neodpovidala hodnota
zadane masce. To ale stale neni duvod pouzivat konstrukci try..except jako
if..then v situacich, kdy primo predpokladas (je soucasti logiky te funkce) ze
vzikne vyjimka a podle toho rozhodujes o vysledku funkce. Tak to prave bylo v
tom puvodnim prikladu.

Je to podobne jinemu typicky spatnemu prikladu na zjisteni zdali lze retezec
prevest na cislo:

try
  I := StrToInt(S);
except
  I := 0;
end;

Petr Vones

Odpovedá: Zbysek Hlinka

4. 9. 2002 14:54

On 4 Sep 2002 at 13:00, Petr Vones wrote:

> > jsem narazil pri psani Lokalizatoru, konkretne u tridy
> > TMaskEdit.Text, kde SetStrProp skonci chybou, pokud se plni jindy
> > nez pri csLoading, protoze se spusti validace. Plnil jsem tam
> > hodnotu,
>
> Stejne by to bylo i pri primem volani Caption := '...'.

Pokud ovsem pred tim nezavolas SetDesigning(true), nebo neco jineho,
co se nelibi validacni funkci.

> > ktera prisla z navrhu formulare. Pokud nemas jistotu, jake objekty
> > se ti tam nahrnou, je pouziti try except nezbytne.
>
> Pokud vznikne vyjimka (tedy situace neocekavana, chybna, branici
> pokracovat v danem kodu) tak to neznamena ze to jen tak zahodis a
> delas, ze se nic nedeje. V pripade TMaskEdit je to napriklad to, ze po
> validaci neodpovidala hodnota zadane masce. To ale stale neni duvod
> pouzivat konstrukci try..except jako if..then v situacich, kdy primo
> predpokladas (je soucasti logiky te funkce) ze vzikne vyjimka a podle
> toho rozhodujes o vysledku funkce. Tak to prave bylo v tom puvodnim
> prikladu.

U SetXxxProp to prave neovlivnis, protoze jednak nemusis vedet, co a
kam cpes (samozrejme, ze zalezi na typu ulohy, u Lokalizatoru to
nevim), jednak prave zde nelze testovat pres if, pokud neznas mnozinu
cilovych objektu, jednak kdyz ti to nekde rachne, je nutne problem
osetrit a pokracovat dal pro dalsi objekty a vlastnosti. Toto je
prave pripad, kdy muze dojit k neocekavane chybe, a casto neni jina
moznost, jak ji osetrit.

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Lauko Stefan

4. 9. 2002 21:54

> From: "Lauko Stefan" <laukosw@naex.sk>
> > Procedure SetCaption(O:TObject; S:String);
> > begin
> > try
> > SetStrProp(O, 'Caption',S);
> > Except
> > end;
> > end;
>
----- Original Message -----
From: "Petr Vones" <pvones@mbox.vol.cz>
> Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek. Vyjimka je neco
> vyjimecneho, co by nemelo za beznych podminek vzniknout. V tomto pripade
je
> vsak pouzita jako nedilna soucast logiky te procedury. (nemluve o
predavani
> promenne typu string ktera by mela byt const S: string)

Jasne ze to je nekorektne ale tymto som chcel ukazat moznost pouzit unit
TypInfo. Ked by sa tazatel pozrel na funkcie tak tam je mozne taketo nieco
vyriesit uplne bez problemu a korektne.
Ty si to napisal presne :
 PropInfo := GetPropInfo(Control, 'Caption', [tkLString]);
  Result := PropInfo <> nil;
  if Result then
    SetStrProp(Control, PropInfo, Caption);
Ja som ale chcel aby tazatel trochu studoval... . Chcel som ho len
"nakopnut".
Lauko.

Odpovedá: Erik Salaj

5. 9. 2002 23:18

> Mozna, ale pouzivat misto jedne konstrukce if ... then try..raise..except
neni
> prilis pohodlne a navic v tom puvodnim prikladu to melo jeste dalsi chybu
a
> to, ze se takto 'neosetrovala' pouze predpokladana vyjimka, ale vsechny
dalsi
> ktere mohly indikovat jinou dalsi (tentokrate skutecne nepredpokladanou)
> chybu.
>
> Timto 'modernim' stylem by jsme se vlastne mohli dostat i ke konstrukcim
jako
> (pripad kdy instance objektu nemusi existovat):

Try/finally/except nie je vlastne nic ine, len vylepsene "goto". Ma svoje
opodstatnenie ak nie je nic lepsie k dispozicii, ale netreba to prehanat.
Rozhodne if prikaz je "normalnejsi" na riadenie programu ako
generovanie a odchytavanie vynimiek.

Erik

Odpovedá: Jiri Foldyna

5. 9. 2002 11:14

> > No jo, jenze to je dnes modni a dokonce to ma svuj terminus
> technicus -
> > ofenzivni programovaci styl  . Nediv se, je to
> pohodlnejsi, mene
> > narocne na hlavu a zejmena to zapada do komercniho modelu
> prodeje SW. Proc
>
> Mozna, ale pouzivat misto jedne konstrukce if ... then
> try..raise..except neni
> prilis pohodlne a navic v tom puvodnim prikladu to melo jeste
> dalsi chybu a
> to, ze se takto 'neosetrovala' pouze predpokladana vyjimka,
> ale vsechny dalsi
> ktere mohly indikovat jinou dalsi (tentokrate skutecne
> nepredpokladanou)
> chybu.

Ahoj,

minil jsem to spis jako pokus o trpky zert. Muj nazor na vec se shoduje s
Tvym, tj. pouziti exception by se nemelo systematicky pouzivat jako
zkratkove osetreni vsech chyb (tedy i chyb v analyze  . Za prve je to
nejspis neefektivni, za druhe to muze zakryvat chyby v algoritmech, za
jejichz odhalovani se pak krvave plati (mysleno pouze zcasti obrazne   v
rutinnim nasazeni.

> Jinak receno, pouziva-li se nekde konstrukce try..except je
> nutne dobre zvazit
> jeji oduvodnenost a mozne dusledky.

Naprosty souhlas.

Zdravim

Jiri Foldyna
mailto:jiri.f@avizo.cz

>
> Petr Vones

Odpovedá: Jakub Dusek

3. 9. 2002 12:13

Bohuzel TControl ma Caption v private, je potreba to tedy udelat jeste
pres jednoho potomka a vytahnout to do public:

type
  TCaptionControl = class (TControl)
  public
    property Caption;
  end;

...

begin
  for i := 0 to Form1.ComponentCount - 1 do
  begin
    Obj := Form1.Components [i];
    if Obj is TControl then
      TCaptionControl (Obj).Caption := 'x';
  end;
end;

Jakub Dusek

-------------------------------------------
Homepage : http://dusek.zde.cz
Phone : +420604615795
Sms email : jakub.dusek@click.cz
ICQ: 86063232
Apps : Add/Remove Manager, Charmaper,
            Sms GateKeeper
-------------------------------------------

Tuesday, September 3, 2002, 12:25:15 PM, you wrote:

iJF> Jde to castecne vyresit, pokud pouzijes spolecneho predka, ktery je v
iJF> hierarchii nejvys a pritom ma jeste potrebne vlastnosti.
iJF> V tomto pripade je to TControl.
iJF> Takze by to mohlo vypadat takto:

iJF> For i:=0 to Form1.ComponentCount-1 Do Begin
iJF> obj := Form1.Components[i];
iJF> If obj is TControl Then TControl(obj).Caption := 'x';
iJF> ........
iJF> End;

iJF> Stale se nevyhnes deleni, ale zmensis pocet techto deleni.